package org.example.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.QueryResults;
import org.kie.internal.utils.KieHelper;
import org.springframework.core.env.Environment;

import java.io.File;
import java.nio.charset.StandardCharsets;

/*
 * @className: KieSessionUtils
 * @author: chentao
 * @date: 2025/7/1 17:00
 * @Version: 1.0
 * @description:
 */
public class KieSessionUtils {

    /***
     * 加载规则文件内容并获取会话
     * @param text 规则文件的内容
     * @return
     */
    public static KieSession getKieSession(String text) {
        KieHelper helper = new KieHelper();
        helper.addContent(text, ResourceType.DRL);
        return helper.build().newKieSession();
    }

    /***
     * 加载规则文件
     * @param fileName 规则文件的全路径地址
     * @return
     */
    public static KieSession getKieSessionFFile(String fileName) {
        Environment environment = SpringBeanUtils.getApplicationContext().getEnvironment();
        if (FileUtil.exist(environment.getProperty("drools.dir.path") + File.separator + fileName)) {
            String fullPath = environment.getProperty("drools.dir.path") + File.separator + fileName;
            return getKieSession(FileUtil.readString(fullPath, StandardCharsets.UTF_8));
        } else {
            String fullPath = environment.getProperty("drools.class.path") + fileName;
            return getKieSession(IoUtil.read(KieSessionUtils.class.getClassLoader().getResourceAsStream(fullPath), StandardCharsets.UTF_8));
        }
    }

    /***
     * 执行规则文件的内容并实现查询
     * @param text 规则文件内容
     * @param query
     * @param arguments
     * @return
     */
    public static QueryResults getQueryResults(String text, String query, Object... arguments) {
        return getKieSession(text).getQueryResults(query, arguments);
    }

    /***
     * 执行规则文件并返回结果
     * @param fileName 规则文件的全路径地址
     * @param query
     * @param arguments
     * @return
     */
    public static QueryResults getQueryResultsFFile(String fileName, String query, Object... arguments) {
        return getKieSessionFFile(fileName).getQueryResults(query, arguments);
    }

    /***
     * 执行规则文件并返回结果
     * @param fileName 规则文件全路径
     * @param wrapObj 规则参数的包装类
     * @return
     */
    public static Object execRuleFile(String fileName, Object wrapObj) {
        KieSession kieSession = getKieSessionFFile(fileName);
        kieSession.insert(wrapObj);
        kieSession.fireAllRules();
        kieSession.dispose();
        return wrapObj;
    }

    /***
     * 执行规则内容并返回结果
     * @param text 规则文件的内容
     * @param wrapObj 规则参数的包装类
     * @return
     */
    public static Object execRuleText(String text, Object wrapObj) {
        KieSession kieSession = getKieSession(text);
        kieSession.insert(wrapObj);
        kieSession.fireAllRules();
        kieSession.dispose();
        return wrapObj;
    }
}
